package com.boguan.device.service;

import com.alibaba.fastjson.JSONObject;
import com.boguan.common.core.domain.entity.SysUser;
import com.boguan.device.domain.*;
import com.boguan.device.domain.dto.AddGroupDto;
import com.boguan.device.domain.dto.AlarmHistoryDto;
import com.boguan.device.domain.dto.DeviceInfoDto;
import com.boguan.device.domain.dto.DeviceSearchDto;
import com.boguan.device.domain.vo.*;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 设备主要业务逻辑相关
 *
 * @author chen
 */
public interface IDeviceService {

    /**
     * 根据设备类型id查询设备信息
     *
     * @param typeId 设备类型id
     * @return
     */
    List<Device> selectDeviceByTypeId(Long typeId);


    /**
     * 根据设备类型id查询设备信息
     *
     * @param deviceId 设备id
     * @return
     */
    Device selectDeviceByDeviceId(Long deviceId);

    /**
     * 校验设备编号是否唯一
     *
     * @param device 设备信息
     * @return
     */
    String checkDeviceNumUnique(Device device);

    /**
     * 创建设备信息
     *
     * @param device
     * @return
     */
    int createDevice(Device device);

    /**
     * 更新修改设备信息
     *
     * @param device
     * @return
     */
    int updateDevice(Device device);

    /**
     * 查询出根据 搜索查询设备
     *
     * @param device
     * @return
     */
    List<Device> searchPage(Device device);

    /**
     * 删除设备信息
     *
     * @param deviceId
     * @return
     */
    int deleteDevice(Long deviceId);

    /**
     * 查询出设备参数信息
     *
     * @param deviceId
     * @param paramType
     * @return
     */
    DeviceParamVo selectDeviceParam(Long deviceId, Integer paramType);

    /**
     * 修改设备的配置信息
     *
     * @param deviceParamVo
     * @return
     */
    int setDeviceParam(DeviceParamVo deviceParamVo);

    /**
     * 设备报警属性查询
     *
     * @param deviceId
     * @return
     */
    List<DeviceAlarmInform> selectDeviceAlarmConfig(Long deviceId);

    /**
     * 设备添加报警用户
     *
     * @param deviceAlarmInform
     * @return
     */
    int addDeviceAlarmConfig(DeviceAlarmInform deviceAlarmInform);

    /**
     * 更新设备报警用户
     *
     * @param deviceAlarmInform
     * @return
     */
    int updateDeviceAlarmConfig(DeviceAlarmInform deviceAlarmInform);

    /**
     * 删除报警通知用户
     *
     * @param id
     * @return
     */
    int deleteDeviceAlarmConfig(Long id);

    /**
     * 根据设备id和时间区间查询出时间区间
     *
     * @param deviceId
     * @param startTime
     * @param endTime
     * @return
     */
    Map<String, Object> selectHistoryData(Long deviceId, Date startTime, Date endTime, Integer pageNum, Integer pageSize);

    /**
     * 根据区域id查询出该区域下的设备数量
     *
     * @param user
     * @return
     */
    Integer deviceCount(SysUser user);

    /**
     * 根据区域id查询出该区域下离线和在线的数量
     *
     * @param user
     * @return
     */
    List<Map<String, Integer>> deviceOnlineCount(SysUser user);

    /**
     * 查询出该区域下级区域的设备数量
     *
     * @param user
     * @return
     */
    List<Map<String, Object>> subordinateDeviceCount(SysUser user);

    /**
     * 查询出不同类型的设备数量
     *
     * @param user
     * @return
     */
    List<Map<String, Object>> typeDeviceCount(SysUser user);

    /**
     * 根据设备编号查询设备信息
     *
     * @param deviceNum
     * @param addr
     * @return
     */
    Device selectDeviceByDeviceNum(String deviceNum, Integer addr);

    /**
     * 修改设备参数信息
     *
     * @param deviceParam
     * @return
     */
    int updateDeviceParam(DeviceParam deviceParam);

    /**
     * 给设备添加参数
     *
     * @param deviceParam
     * @return
     */
    int insertSelective(DeviceParam deviceParam);

    /**
     * 根据设备id删除设备参数内的值
     *
     * @param deviceId
     * @return
     */
    int deleteDeviceParam(Long deviceId);

    /**
     * 添加历史记录数据
     *
     * @param pastRecords
     * @return
     */
    int insertSelectivePastRecords(DevicePastRecords pastRecords);

    /**
     * 查询历史数据图标
     *
     * @param deviceId
     * @param startTime
     * @param endTime
     * @return
     */
    List<ChartVo> historyDataChart(Long deviceId, Date startTime, Date endTime);

    /**
     * 设备上下线处理
     *
     * @param jsonObject
     * @return
     */
    int onlineOrOffline(JSONObject jsonObject);


    /**
     * 保存设备日志
     */
    int saveDeviceLog(DeviceLog deviceLog);

    /**
     * 设备信息单个下发配置
     *
     * @param deviceParam
     * @return
     */
    int setDeviceParamOne(DeviceParam deviceParam);


    /**
     * 根据省
     * 市
     * 区
     * 查询出不同的数量
     *
     * @return
     */
    List<DeviceNumBySite> selectDeviceNumBySite(DeviceNumBySite deviceNumBySite);

    /**
     * 导出excel
     *
     * @param deviceId
     * @param startTime
     * @param endTime
     * @return
     */
    String selectHistoryDataExport(Long deviceId, Date startTime, Date endTime);

    /**
     * 根据单个属性查询出单个属性的曲线
     *
     * @param deviceId
     * @param paramId
     * @param startTime
     * @param endTime
     * @return
     */
    List<ChartVo> selectParamChart(Long deviceId, Long[] paramId, Date startTime, Date endTime);

    /**
     * 设备父级id和子级位置查询出子级设备
     *
     * @param parentId
     * @param addr
     * @return
     */
    Device selectChildDeviceByParentIdAndAddr(Long parentId, Integer addr);

    /**
     * 根据设备id查询出设备的子设备信息
     *
     * @param deviceId
     * @return
     */
    List<Device> selectChildDeviceByParentId(Long deviceId);

    /**
     * 修改全部子级设备
     *
     * @param device
     * @return
     */
    int updateChildDevice(Device device);

    /**
     * 设备开关控制
     *
     * @param deviceId
     * @param state
     * @param weiyu_user
     * @return
     */
    int controlTurn(Long deviceId, Integer state, String weiyu_user);

    //所有设备列表
    List<DeviceListVo> getAllDeviceList(Long deptId);

    //按名称搜索设备
    List<DeviceListVo> searchDeviceName(DeviceSearchDto dto);

    //添加设备
    int insertDevice(DeviceInfoDto dto);
    //删除设备
    int deviceDelete(String id);

    //设备详情
    HashMap<String,Object> deviceDetail (String id);

    //设备详情报警历史数据
    List<DeviceAlarmCountVo> deviceDetailAlarmHistory(AlarmHistoryDto dto);


    //设备分组
    List<DeviceGroupChildVo> deviceGroup(String id,String group_name);

    List<DeviceGroupVo> deviceGroupDetail(Integer id);

    //修改设备分组
    int deviceGroupEdit(String group_name,String id);

    //创建设备分组
    int createDeviceGroup(AddGroupDto dto);


    int addToDeviceGroup(List<String> ids,String groupName);

    int deviceModify(Long deviceId,String deviceName,String deviceNo,String locations,String height,String low);

    int deleteDeviceGroup(String group_id);

    int deleteDeviceFromGroup(String id);

    Map<String,String> deviceStatus();

    List<Object> bigScreen();


    List<DeviceListVo> checkDeviceNum(String device_num);

    int deviceToGroup(String group_id,String device_id);










}
